package utils

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
)

// FileCache 结构体用于管理文件缓存
type FileCache struct {
	CacheDir string
}

// NewFileCache 创建一个新的 FileCache 实例
func NewFileCache(cacheDir string) (*FileCache, error) {
	// 确保缓存目录存在
	err := os.MkdirAll(cacheDir, 0755)
	if err != nil {
		return nil, fmt.Errorf("failed to create cache directory: %v", err)
	}
	return &FileCache{CacheDir: cacheDir}, nil
}

// GetFile 从缓存中获取文件，如果不存在则从源文件读取并缓存
func (fc *FileCache) GetFile(filePath string) ([]byte, error) {
	cachePath := filepath.Join(fc.CacheDir, filepath.Base(filePath))
	// 从源文件读取数据
	data, err := ioutil.ReadFile(cachePath)
	if err != nil {
		return nil, fmt.Errorf("failed to read source file: %v", err)
	}

	// 将数据写入缓存
	err = fc.StoreCache(cachePath, data)
	if err != nil {
		return nil, fmt.Errorf("failed to store cache: %v", err)
	}

	return data, nil
}

// StoreCache 将数据存储到缓存中
func (fc *FileCache) StoreCache(filePath string, data []byte) error {
	cachePath := filepath.Join(fc.CacheDir, filepath.Base(filePath))
	err := ioutil.WriteFile(cachePath, data, 0644)
	if err != nil {
		return fmt.Errorf("failed to write cache file: %v", err)
	}
	return nil
}

// ClearCache 清除所有缓存文件
func (fc *FileCache) ClearCache() error {
	return os.RemoveAll(fc.CacheDir)
}
